#!/bin/bash

# =============================================================================
# build_windows_exe.sh - Windows EXE 构建脚本
# =============================================================================
#
# 功能描述：
#   在 macOS/Linux 环境下构建适用于 Windows 系统的可执行文件(.exe)
#   该脚本自动化了从 Java 源码到 Windows 可执行文件的完整构建流程
#
# 主要步骤：
#   1. 环境检查：验证 Java 和 Maven 环境
#   2. 清理构建：删除之前的构建产物
#   3. Maven 构建：编译源码并生成 JAR 文件
#   4. Launch4j 打包：将 JAR 文件包装为 Windows EXE 文件
#   5. 结果验证：检查生成的文件并显示构建摘要
#
# 使用方法：
#   chmod +x build_windows_exe.sh
#   ./build_windows_exe.sh
#
# 系统要求：
#   - macOS/Linux 操作系统
#   - Java 8+ (JDK)
#   - Maven 3.6+
#   - Launch4j Maven 插件（通过 pom.xml 配置）
#
# 输出文件：
#   - target/kk-toolbox-1.0.0.jar (Java 可执行 JAR)
#   - target/黄PP的工具小黑匣.exe (Windows 可执行文件)
#
# @author KK-Toolbox
# @version 1.0.0
# @since 2025-01-01
# =============================================================================

# 脚本配置
set -e  # 遇到任何错误时立即退出
set -u  # 使用未定义变量时报错

# 颜色定义（用于美化输出）
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly BLUE='\033[0;34m'
readonly NC='\033[0m' # No Color

# 项目配置
readonly PROJECT_NAME="KK-Toolbox"
# 从 pom.xml 中提取版本号
readonly PROJECT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout 2>/dev/null || echo "1.0.0")
readonly JAR_FILE="target/kk-toolbox-${PROJECT_VERSION}.jar"
readonly EXE_FILE="target/黄PP的工具小黑匣.exe"

# =============================================================================
# 工具函数
# =============================================================================

# 打印带颜色的信息
print_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查命令是否存在
check_command() {
    if ! command -v "$1" &> /dev/null; then
        print_error "$2"
        exit 1
    fi
}

# 获取文件大小（人类可读格式）
get_file_size() {
    if [ -f "$1" ]; then
        ls -lh "$1" | awk '{print $5}'
    else
        echo "N/A"
    fi
}

# =============================================================================
# 主要构建流程
# =============================================================================

print_info "=== ${PROJECT_NAME} Windows EXE 构建脚本 ==="
print_info "开始时间: $(date)"
echo ""

# 步骤1：检查 Java 环境
print_info "1. 检查 Java 环境..."
check_command "java" "未找到 Java 环境，请先安装 JDK 8 或更高版本"

JAVA_VERSION=$(java -version 2>&1 | head -n 1 | cut -d'"' -f2)
print_success "Java 版本: ${JAVA_VERSION}"

# 检查 Java 版本是否满足要求（至少 1.8）
JAVA_MAJOR_VERSION=$(echo "$JAVA_VERSION" | cut -d'.' -f1)
JAVA_MINOR_VERSION=$(echo "$JAVA_VERSION" | cut -d'.' -f2)

if [ "$JAVA_MAJOR_VERSION" -eq 1 ] && [ "$JAVA_MINOR_VERSION" -lt 8 ]; then
    print_error "Java 版本过低，需要 Java 8 或更高版本"
    exit 1
fi

# 步骤2：检查 Maven 环境
echo ""
print_info "2. 检查 Maven 环境..."
check_command "mvn" "未找到 Maven，请先安装 Maven 3.6 或更高版本"

MVN_VERSION=$(mvn -version | head -n 1)
print_success "Maven 版本: ${MVN_VERSION}"

# 步骤3：清理之前的构建
echo ""
print_info "3. 清理之前的构建产物..."
if [ -d "target" ]; then
    print_info "删除 target 目录..."
    rm -rf target
    print_success "清理完成"
else
    print_info "target 目录不存在，跳过清理"
fi

# 步骤4：构建项目
echo ""
print_info "4. 构建 JAR 包和 EXE 文件..."
print_info "执行命令: mvn clean package -DskipTests"

# 执行 Maven 构建，捕获输出以便错误处理
if mvn clean package -DskipTests; then
    print_success "Maven 构建完成"
else
    print_error "Maven 构建失败，请检查错误信息"
    exit 1
fi

# 步骤5：验证构建结果
echo ""
print_info "5. 验证构建结果..."

# 检查 JAR 文件
if [ -f "$JAR_FILE" ]; then
    JAR_SIZE=$(get_file_size "$JAR_FILE")
    print_success "JAR 文件构建成功: ${JAR_FILE} (${JAR_SIZE})"
else
    print_error "JAR 文件构建失败: ${JAR_FILE}"
    exit 1
fi

# 检查 EXE 文件
if [ -f "$EXE_FILE" ]; then
    EXE_SIZE=$(get_file_size "$EXE_FILE")
    print_success "EXE 文件构建成功: ${EXE_FILE} (${EXE_SIZE})"
else
    print_error "EXE 文件构建失败: ${EXE_FILE}"
    print_warning "请检查 Launch4j 插件配置是否正确"
    exit 1
fi

# =============================================================================
# 构建完成摘要
# =============================================================================

echo ""
print_success "=== 构建完成 ==="
print_info "完成时间: $(date)"
echo ""
print_info "生成的文件:"
print_info "  - JAR 文件: ${JAR_FILE} (${JAR_SIZE})"
print_info "  - EXE 文件: ${EXE_FILE} (${EXE_SIZE})"
echo ""
print_warning "重要提示:"
print_warning "  1. EXE 文件仅能在 Windows 系统上运行"
print_warning "  2. 目标 Windows 系统需要安装 Java 8 或更高版本"
print_warning "  3. 首次运行可能被杀毒软件拦截，建议添加信任或进行数字签名"
print_warning "  4. 如需分发，建议同时提供 JAR 文件作为备选方案"
echo ""
print_success "构建脚本执行完成！"

# 脚本执行成功
exit 0